﻿using HidLibrary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace USB_HID调试工具
{
    public partial class Form1 : Form
    {
        private HidDevice _device;          // 定义一个HidDevice对象，用于操作HID设备
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.AppendText("0x5750");
            textBox2.AppendText("0x0483");
            for (int i = 1; i <= 63; i++)
            {
                richTextBox2.AppendText(i.ToString() + " "); // 每个数字后加一个空格
            }
        }
        // 连接设备按钮点击事件
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                UInt16 VID = Convert.ToUInt16(textBox2.Text, 16);   // 将16进制字符串转换为UInt16
                UInt16 PID = Convert.ToUInt16(textBox1.Text, 16);
     
                var devices = HidDevices.Enumerate(VID, PID);       // 替换为你的设备的VID和PID
                if (devices.Count() > 0)                          
                {
                    _device = devices.First();
                    _device.OpenDevice();               // // 尝试打开设备
                    if (_device.IsOpen)
                    {
                        MessageBox.Show("设备连接成功！");
                        _device.ReadReport(OnReport);  // 开始接收数据
                        //button1.Enabled = false;       // 禁用连接按钮
                        //button7.Enabled = true;        // 启用断开按钮
                    }
                    else
                    {
                        MessageBox.Show("设备打开失败！");
                    }
                }
                else
                {
                    MessageBox.Show("未找到设备！");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"发生错误：{ex.Message}");
            }
        }

        // 发送数据按钮点击事件
        private void button6_Click(object sender, EventArgs e)
        {
            if (_device != null && _device.IsOpen)            // 检查设备是否已连接且打开
            {
                try
                {
                    string inputText = richTextBox2.Text.Trim(); // 获取文本框内容并去除首尾空格
                    byte[] dataToSend = new byte[64]; // 根据报告长度调整
                    dataToSend[0] = 0x01; // 报告ID，0x01代表主机向从机发送数据

                    // 将输入的字符串按空格分割为多个数值
                    string[] values = inputText.Split(' ');
                    byte[] inputBytes = new byte[63];

                    // 将每个数值字符串转换为字节
                    for (int i = 0; i < 63; i++)
                    {
                        if (!string.IsNullOrEmpty(values[i]))
                        {
                            // 将字符串转换为数值（如 "13" 转换为 0x13）
                            inputBytes[i] = Convert.ToByte(values[i], 16); // 假设输入是16进制字符串
                        }
                    }

                    // 将数值字节复制到发送数据数组中
                    Array.Copy(inputBytes, 0, dataToSend, 1, Math.Min(inputBytes.Length, dataToSend.Length - 1));

                    // 创建 HidReport 对象
                    var report = new HidReport(1); // 假设报告ID为1，根据你的设备需求调整
                    report.Data = dataToSend; // 将数据填充到报告中

                    // 发送报告
                    _device.WriteReport(report);
                    MessageBox.Show("数据发送成功！");
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"发送失败：{ex.Message}");
                }
            }
            else
            {
                MessageBox.Show("设备未连接！");
            }
        }

        // 数据接收回调
        private void OnReport(HidReport report)
        {

            if (report.Data.Length > 0)
            {
                bool isAllZeros = report.Data.All(b => b == 0x00);
                if (isAllZeros)
                {
                    _device.CloseDevice();
                    MessageBox.Show("设备已断开！");
                    return;
                }
                string receivedData = BitConverter.ToString(report.Data).Replace("-", " ");            // 将接收到的数据转换为十六进制字符串           
                string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");                   // 获取当前时间戳
                this.Invoke(new Action(() =>
                {
                    //richTextBox1.AppendText(receivedData + Environment.NewLine); // 显示接收到的数据
                    richTextBox1.AppendText($"{timestamp} ：{receivedData}" + Environment.NewLine);
                    richTextBox1.ScrollToCaret(); // 自动滚动到最新内容
                }));
                if (_device != null && _device.IsOpen)                         // 重新启动读取，以便持续接收数据
                {
                    _device.ReadReport(OnReport);
                }
                if (isAllZeros)
                {
                    _device.CloseDevice();
                }
            }
        }
      
        private void button7_Click(object sender, EventArgs e)
        {
            if (_device != null && _device.IsOpen)
            {
                _device.CloseDevice();
                MessageBox.Show("设备已断开！");
                //button1.Enabled = true;  // 启用连接按钮
                //button7.Enabled = false; // 禁用断开按钮
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            richTextBox1.Clear();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            richTextBox2.Clear();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            richTextBox2.Clear();
            Random random = new Random();               // 生成63个随机数据
            string randomData = string.Empty;
            for (int i = 0; i < 63; i++)
            {
                // 生成一个随机的十六进制数（00到FF）
                string randomHex = random.Next(0, 256).ToString("X2");
                randomData += randomHex + " "; // 添加空格分隔
            }
            richTextBox2.AppendText(randomData.Trim()); // Trim用于移除最后一个多余的空格
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            SendData();
        }

        private void radioButton2_CheckedChanged(object sender, EventArgs e)
        {
            timer1.Enabled=false;
        }

        private void SendData()    //定义1个发送函数
        {
            if (_device != null && _device.IsOpen) // 检查设备是否已连接且打开
            {
                
                    string inputText = richTextBox2.Text.Trim(); // 获取文本框内容并去除首尾空格
                    byte[] dataToSend = new byte[64]; // 根据报告长度调整
                    dataToSend[0] = 0x01; // 报告ID，0x01代表主机向从机发送数据

                    // 将输入的字符串按空格分割为多个数值
                    string[] values = inputText.Split(' ');
                    byte[] inputBytes = new byte[63];

                    // 将每个数值字符串转换为字节
                    for (int i = 0; i < values.Length; i++)
                    {
                        if (!string.IsNullOrEmpty(values[i]))
                        {
                            // 将字符串转换为数值（如 "13" 转换为 0x13）
                            inputBytes[i] = Convert.ToByte(values[i], 16); // 假设输入是16进制字符串
                        }
                    }

                    // 将数值字节复制到发送数据数组中
                    Array.Copy(inputBytes, 0, dataToSend, 1, Math.Min(inputBytes.Length, dataToSend.Length - 1));

                    // 创建 HidReport 对象
                    var report = new HidReport(1); // 假设报告ID为1，根据你的设备需求调整
                    report.Data = dataToSend; // 将数据填充到报告中

                    // 发送报告
                    _device.WriteReport(report);
          
               
                
            }
          
        }


    }
}
    


        

    


